﻿using System;
using UtfprLibrary.Exceptions;

namespace UtfprLibrary.Validations.Brazilian {
    public static class CPF {
        /// <summary>
        /// 
        /// </summary>
        /// <exception cref="UtfprLibrary.Exceptions.UtfprValidationsException">Thrown when an exception occurs.</exception>
        public static bool Validate(string cpf) {
            try {
                string valor = cpf.Replace(".", "");
                valor = valor.Replace("-", "");

                if (valor.Length != 11) {
                    return false;
                }

                bool igual = true;

                for (int i = 1; i < 11 && igual; i++) {
                    if (valor[i] != valor[0]) {
                        igual = false;
                    }
                }
                if (igual || valor == "12345678909") {
                    return false;
                }

                int[] numeros = new int[11];

                for (int i = 0; i < 11; i++) {
                    numeros[i] = int.Parse(valor[i].ToString());
                }

                int soma = 0;

                for (int i = 0; i < 9; i++) {
                    soma += (10 - i) * numeros[i];
                }

                int resultado = soma % 11;

                if (resultado == 1 || resultado == 0) {
                    if (numeros[9] != 0) {
                        return false;
                    }
                } else if (numeros[9] != 11 - resultado) {
                    return false;
                }

                soma = 0;

                for (int i = 0; i < 10; i++) {
                    soma += (11 - i) * numeros[i];
                }

                resultado = soma % 11;

                if (resultado == 1 || resultado == 0) {
                    if (numeros[10] != 0) {
                        return false;
                    }
                } else {
                    if (numeros[10] != 11 - resultado) {
                        return false;
                    }
                }

                return true;
            } catch (Exception ex) {
                throw new UtfprValidationsException(Properties.Resources.Validations_Brazilian_CPF_ExMsg_Validate, ex);
            }
        }
    }
}